(function() {
	/*
	 * xml2json v 1.1 copyright 2005-2007 Thomas Frank
	 * 
	 * This program is free software under the terms of the GNU General Public
	 * License version 2 as published by the Free Software Foundation. It is
	 * distributed without any warranty.
	 */

	xml2json = {
		parser : function(xmlcode, ignoretags, debug) {
			if (!ignoretags) {
				ignoretags = ""
			}
			;
			xmlcode = xmlcode.replace(/\s*\/>/g, '/>');
			xmlcode = xmlcode.replace(/<\?[^>]*>/g, "").replace(/<\![^>]*>/g,
					"");
			if (!ignoretags.sort) {
				ignoretags = ignoretags.split(",")
			}
			;
			var x = this.no_fast_endings(xmlcode);
			x = this.attris_to_tags(x);
			x = escape(x);
			x = x.split("%3C").join("<").split("%3E").join(">").split("%3D")
					.join("=").split("%22").join("\"");
			for ( var i = 0; i < ignoretags.length; i++) {
				x = x.replace(new RegExp("<" + ignoretags[i] + ">", "g"),
						"*$**" + ignoretags[i] + "**$*");
				x = x.replace(new RegExp("</" + ignoretags[i] + ">", "g"),
						"*$***" + ignoretags[i] + "**$*")
			}
			;
			x = '<JSONTAGWRAPPER>' + x + '</JSONTAGWRAPPER>';
			this.xmlobject = {};
			var y = this.xml_to_object(x).jsontagwrapper;
			if (debug) {
				y = this.show_json_structure(y, debug)
			}
			;
			return y
		},
		xml_to_object : function(xmlcode) {
			var x = xmlcode.replace(/<\//g, "$");
			x = x.split("<");
			var y = [];
			var level = 0;
			var opentags = [];
			for ( var i = 1; i < x.length; i++) {
				var tagname = x[i].split(">")[0];
				opentags.push(tagname);
				level++
				y.push(level + "<" + x[i].split("$")[0]);
				while (x[i].indexOf("$" + opentags[opentags.length - 1] + ">") >= 0) {
					level--;
					opentags.pop()
				}
			}
			;
			var oldniva = -1;
			var objname = "this.xmlobject";
			for ( var i = 0; i < y.length; i++) {
				var preeval = "";
				var niva = y[i].split("<")[0];
				var tagnamn = y[i].split("<")[1].split(">")[0];
				tagnamn = tagnamn.toLowerCase();
				var rest = y[i].split(">")[1];
				if (niva <= oldniva) {
					var tabort = oldniva - niva + 1;
					for ( var j = 0; j < tabort; j++) {
						objname = objname
								.substring(0, objname.lastIndexOf("."))
					}
				}
				;
				objname += "." + tagnamn;
				var pobject = objname.substring(0, objname.lastIndexOf("."));
				if (eval("typeof " + pobject) != "object") {
					preeval += pobject + "={value:" + pobject + "};\n"
				}
				;
				var objlast = objname.substring(objname.lastIndexOf(".") + 1);
				var already = false;
				for (k in eval(pobject)) {
					if (k == objlast) {
						already = true
					}
				}
				;
				var onlywhites = true;
				for ( var s = 0; s < rest.length; s += 3) {
					if (rest.charAt(s) != "%") {
						onlywhites = false
					}
				}
				;
				if (rest != "" && !onlywhites) {
					if (rest / 1 != rest) {
						rest = "'" + rest.replace(/\'/g, "\\'") + "'";
						rest = rest.replace(/\*\$\*\*\*/g, "</");
						rest = rest.replace(/\*\$\*\*/g, "<");
						rest = rest.replace(/\*\*\$\*/g, ">")
					}
				} else {
					rest = "{}"
				}
				;
				if (rest.charAt(0) == "'") {
					rest = 'unescape(' + rest + ')'
				}
				;
				if (already && !eval(objname + ".sort")) {
					preeval += objname + "=[" + objname + "];\n"
				}
				;
				var before = "=";
				after = "";
				if (already) {
					before = ".push(";
					after = ")"
				}
				;
				objname = objname.replace(/%3a/g, '_');
				var toeval = preeval + objname + before + rest + after;
				eval(toeval);
				if (eval(objname + ".sort")) {
					objname += "[" + eval(objname + ".length-1") + "]"
				}
				;
				oldniva = niva
			}
			;
			return this.xmlobject
		},
		show_json_structure : function(obj, debug, l) {
			var x = '';
			if (obj.sort) {
				x += "[\n"
			} else {
				x += "{\n"
			}
			;
			for ( var i in obj) {
				if (!obj.sort) {
					x += i + ":"
				}
				;
				if (typeof obj[i] == "object") {
					x += this.show_json_structure(obj[i], false, 1)
				} else {
					if (typeof obj[i] == "function") {
						var v = obj[i] + "";
						// v=v.replace(/\t/g,"");
						x += v
					} else if (typeof obj[i] != "string") {
						x += obj[i] + ",\n"
					} else {
						x += "'"
								+ obj[i].replace(/\'/g, "\\'").replace(/\n/g,
										"\\n").replace(/\t/g, "\\t").replace(
										/\r/g, "\\r") + "',\n"
					}
				}
			}
			;
			if (obj.sort) {
				x += "],\n"
			} else {
				x += "},\n"
			}
			;
			if (!l) {
				x = x.substring(0, x.lastIndexOf(","));
				x = x.replace(new RegExp(",\n}", "g"), "\n}");
				x = x.replace(new RegExp(",\n]", "g"), "\n]");
				var y = x.split("\n");
				x = "";
				var lvl = 0;
				for ( var i = 0; i < y.length; i++) {
					if (y[i].indexOf("}") >= 0 || y[i].indexOf("]") >= 0) {
						lvl--
					}
					;
					tabs = "";
					for ( var j = 0; j < lvl; j++) {
						tabs += "\t"
					}
					;
					x += tabs + y[i] + "\n";
					if (y[i].indexOf("{") >= 0 || y[i].indexOf("[") >= 0) {
						lvl++
					}
				}
				;
				if (debug == "html") {
					x = x.replace(/</g, "&lt;").replace(/>/g, "&gt;");
					x = x.replace(/\n/g, "<BR>").replace(/\t/g,
							"&nbsp;&nbsp;&nbsp;&nbsp;")
				}
				;
				if (debug == "compact") {
					x = x.replace(/\n/g, "").replace(/\t/g, "")
				}
			}
			;
			return x
		},
		no_fast_endings : function(x) {
			x = x.split("/>");
			for ( var i = 1; i < x.length; i++) {
				var t = x[i - 1].substring(x[i - 1].lastIndexOf("<") + 1)
						.split(" ")[0];
				x[i] = "></" + t + ">" + x[i]
			}
			;
			x = x.join("");
			return x
		},
		attris_to_tags : function(x) {
			var d = ' ="\''.split("");
			x = x.split(">");
			for ( var i = 0; i < x.length; i++) {
				var temp = x[i].split("<");
				for ( var r = 0; r < 4; r++) {
					temp[0] = temp[0].replace(new RegExp(d[r], "g"),
							"_jsonconvtemp" + r + "_")
				}
				;
				if (temp[1]) {
					temp[1] = temp[1].replace(/'/g, '"');
					temp[1] = temp[1].split('"');
					for ( var j = 1; j < temp[1].length; j += 2) {
						for ( var r = 0; r < 4; r++) {
							temp[1][j] = temp[1][j].replace(new RegExp(d[r],
									"g"), "_jsonconvtemp" + r + "_")
						}
					}
					;
					temp[1] = temp[1].join('"')
				}
				;
				x[i] = temp.join("<")
			}
			;
			x = x.join(">");
			x = x.replace(/ ([^=]*)=([^ |>]*)/g, "><$1>$2</$1");
			x = x.replace(/>"/g, ">").replace(/"</g, "<");
			for ( var r = 0; r < 4; r++) {
				x = x.replace(new RegExp("_jsonconvtemp" + r + "_", "g"), d[r])
			}
			;
			return x
		}
	};

	if (!Array.prototype.push) {
		Array.prototype.push = function(x) {
			this[this.length] = x;
			return true
		}
	}
	;

	if (!Array.prototype.pop) {
		Array.prototype.pop = function() {
			var response = this[this.length - 1];
			this.length--;
			return response
		}
	}
	;

})();